import numpy as np
from scipy.fftpack import fft
import matplotlib.pyplot as plt
import cv2 as cv


def myfft_function(signal, begin, end, p):  # p代表指定频率下
    N = end - begin  # 采样点数
    sample_freq = 30  # 采样频率 20 Hz, 大于两倍的最高频率
    N_2 = int(N / 2)

    fft_data = fft(signal)

    # # 计算幅值
    # # 在python的计算方式中，fft结果的直接取模和真实信号的幅值不一样。
    # # 对于非直流量的频率，直接取模幅值会扩大N/2倍， 所以需要除了N乘以2。
    # # 对于直流量的频率(0Hz)，直接取模幅值会扩大N倍，所以需要除了N。
    # fft_amp0 = np.array(np.abs(fft_data) / N * 2)  # 用于计算双边谱
    # fft_amp0[0] = 0.5 * fft_amp0[0]
    # fft_amp = fft_amp0[0:N_2]  # 单边谱

    # 计算相位
    phase_spectrum = np.angle(fft_data, deg=True)  # deg=True表示返回的是角度值，否则是弧度值
    # 将相位从-180~180转换到0~255
    n180 = np.full(N, 180)  # 创建含有N个数的数组，值都为180
    phase_spectrum = (phase_spectrum + n180) * 0.7
    # # 另一种策略将相位从-180~180转换到0~255
    # for i in range(N):
    #     # phase_spectrum[i] = ((phase_spectrum[i] - (-180)) / 360) * 255
    #     if phase_spectrum[i] < 0:
    #         phase_spectrum[i] = (phase_spectrum[i] + 360) * 0.7

    fft_pha = phase_spectrum[0:N_2]

    # 计算频谱的频率轴
    list1 = np.array(range(0, int(N / 2)))
    freq = sample_freq * list1 / N  # 单边谱的频率轴

    # # 返回对应频率相位策略1：通过线性插值找到指定频率p下的幅度值和相位值
    # # amp_result = np.interp(p, freq, fft_amp)
    # pha_result = np.interp(p, freq, fft_pha)  # 使用np.interp(freq_origin, freq1, pha1)可以获得指定横坐标的纵坐标值

    # 返回对应频率相位策略2：
    # 频率p所对应的返回数组中的索引号k
    k = int(p / sample_freq * N)  # 这里的k：因为fft_pha数组共有N个，数组中从每个数分别代表0到20Hz所对应的复数值

    # return 1, int(pha_result)
    return 1, fft_pha[k]
